package chess.piece;

import javax.swing.ImageIcon;
import java.util.ArrayList;
import chess.Position;
import chess.Status;

/**
 * Classe Rook (Torre)
 * @author Beatriz Miho Anami
 * @author Lucas Rodrigues Anizelli
 * @author Marcos Okamura Rodrigues
 */
public final class Rook extends Piece implements MoveMemory {
	private boolean hasMoved;
	
	/**
	 * Construtor da Torre
	 * @param id		id da torre
	 * @param position	posição da torre
	 * @param color		cor da torre
	 * @param imageIcon	imageIcon da torre
	 */
	public Rook(int id, Position position, int color, ImageIcon imageIcon) {
		super(id, position, color, imageIcon);
		this.hasMoved = false;
	}
	
	/**
	 * Modifica a posição do rei.
	 * @param position	nova posição do rei
	 */
	@Override
	public void setPosition(Position position) {
		super.setPosition(position);
		this.hasMoved = true;
	}

	/**
	 * (Sobrescrita) Retorna a representação da torre em String.
	 * @return string "R"
	 */
	public String toString(){
		return "R";
	}
	
	/**
	 * Verifica se a torre pode capturar uma peça na posição especificada.
	 * @param position	posição da peça a ser capturada
	 * @return 			o status da captura
	 */
	public Status canCapture(Position position){
		return this.canMove(position);
	}

	/**
	 * Verifica se a torre pode ser movida para a posição especificada.
	 * @param position	nova posição da torre
	 * @return 			o status do movimento
	 */
	public Status canMove(Position position){ 
		if(Position.isSameRow(this.position, position)){
			return Status.CHECK_ROW;
		} else if(Position.isSameColumn(this.position, position)){
			return Status.CHECK_COLUMN;
		} else {
			return Status.NO;
		}
	}

	/**
	 * Retorna o raio de alcance da torre no tabuleiro.
	 * @return	ArrayList com as posições de alcance da torre
	 */
	public ArrayList<Position> getRange(){
		ArrayList<Position> arrayList = new ArrayList<Position>();
		int row = position.getRow();
		int column = position.getColumn();
		for(int i = row + 1; i < NUMBER_OF_ROWS; i++){
			arrayList.add(new Position(i, column));
		}
		for(int i = row - 1; i >= 0; i--){
			arrayList.add(new Position(i, column));
		}
		for(int i = column + 1; i < NUMBER_OF_COLUMNS; i++){
			arrayList.add(new Position(row, i));
		}
		for(int i = column - 1; i >= 0; i--){
			arrayList.add(new Position(row, i));
		}
		return arrayList;
	}
	
	/**
	 * Verifica se a torre já se moveu alguma vez durante o jogo.
	 * @return true se a torre realizou algum movimento ou false caso contrário
	 */
	public boolean hasMoved() {
		return this.hasMoved;
	}
}
